package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.entity.ChatMessageMedia;
import com.zenithmind.chat.pojo.dto.ChatMessageMediaDTO;
import com.zenithmind.chat.pojo.vo.ChatMessageMediaVO;

import java.util.List;

/**
 * 消息媒体文件服务接口 - 遵循单一职责原则
 * 只负责消息媒体文件的业务逻辑处理
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatMessageMediaService extends IService<ChatMessageMedia> {

    /**
     * 上传媒体文件
     * 
     * @param dto 媒体文件信息
     * @param userId 上传用户ID
     * @return 媒体文件ID
     */
    String uploadMedia(ChatMessageMediaDTO dto, String userId);

    /**
     * 根据消息ID查询媒体文件列表
     * 
     * @param messageId 消息ID
     * @return 媒体文件列表
     */
    List<ChatMessageMediaVO> getMediaByMessageId(String messageId);

    /**
     * 根据媒体文件ID查询详情
     * 
     * @param mediaId 媒体文件ID
     * @param userId 用户ID
     * @return 媒体文件详情
     */
    ChatMessageMediaVO getMediaById(String mediaId, String userId);

    /**
     * 删除媒体文件
     * 
     * @param mediaId 媒体文件ID
     * @param userId 用户ID
     * @return 删除结果
     */
    Boolean deleteMedia(String mediaId, String userId);

    /**
     * 批量删除媒体文件
     * 
     * @param mediaIds 媒体文件ID列表
     * @param userId 用户ID
     * @return 删除结果
     */
    Boolean batchDeleteMedia(List<String> mediaIds, String userId);

    /**
     * 根据消息ID删除所有媒体文件
     * 
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 删除结果
     */
    Boolean deleteMediaByMessageId(String messageId, String userId);

    /**
     * 更新媒体文件信息
     * 
     * @param mediaId 媒体文件ID
     * @param dto 更新信息
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean updateMedia(String mediaId, ChatMessageMediaDTO dto, String userId);

    /**
     * 获取用户上传的媒体文件列表
     * 
     * @param userId 用户ID
     * @param mediaType 媒体类型
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 媒体文件列表
     */
    List<ChatMessageMediaVO> getUserMediaList(String userId, String mediaType, Integer pageNum, Integer pageSize);

    /**
     * 获取群组的媒体文件列表
     * 
     * @param groupId 群组ID
     * @param mediaType 媒体类型
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 媒体文件列表
     */
    List<ChatMessageMediaVO> getGroupMediaList(String groupId, String mediaType, Integer pageNum, Integer pageSize);

    /**
     * 搜索媒体文件
     * 
     * @param keyword 关键词
     * @param mediaType 媒体类型
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 媒体文件列表
     */
    List<ChatMessageMediaVO> searchMedia(String keyword, String mediaType, String userId, Integer pageNum, Integer pageSize);

    /**
     * 获取媒体文件下载链接
     * 
     * @param mediaId 媒体文件ID
     * @param userId 用户ID
     * @return 下载链接
     */
    String getDownloadUrl(String mediaId, String userId);

    /**
     * 获取媒体文件预览链接
     * 
     * @param mediaId 媒体文件ID
     * @param userId 用户ID
     * @return 预览链接
     */
    String getPreviewUrl(String mediaId, String userId);

    /**
     * 检查媒体文件访问权限
     * 
     * @param mediaId 媒体文件ID
     * @param userId 用户ID
     * @return 是否有权限
     */
    Boolean checkMediaAccess(String mediaId, String userId);

    /**
     * 统计用户媒体文件使用情况
     * 
     * @param userId 用户ID
     * @return 统计信息
     */
    Object getUserMediaStatistics(String userId);

    /**
     * 统计群组媒体文件使用情况
     * 
     * @param groupId 群组ID
     * @return 统计信息
     */
    Object getGroupMediaStatistics(String groupId);

    /**
     * 清理过期的媒体文件
     * 
     * @param retentionDays 保留天数
     * @return 清理数量
     */
    Integer cleanupExpiredMedia(Integer retentionDays);

    /**
     * 压缩媒体文件
     * 
     * @param mediaId 媒体文件ID
     * @param quality 压缩质量
     * @param userId 用户ID
     * @return 压缩结果
     */
    Boolean compressMedia(String mediaId, Integer quality, String userId);

    /**
     * 生成媒体文件缩略图
     * 
     * @param mediaId 媒体文件ID
     * @param width 宽度
     * @param height 高度
     * @param userId 用户ID
     * @return 缩略图URL
     */
    String generateThumbnail(String mediaId, Integer width, Integer height, String userId);

    /**
     * 转换媒体文件格式
     * 
     * @param mediaId 媒体文件ID
     * @param targetFormat 目标格式
     * @param userId 用户ID
     * @return 转换结果
     */
    Boolean convertMediaFormat(String mediaId, String targetFormat, String userId);

    /**
     * 批量上传媒体文件
     * 
     * @param dtoList 媒体文件信息列表
     * @param userId 上传用户ID
     * @return 上传结果
     */
    List<String> batchUploadMedia(List<ChatMessageMediaDTO> dtoList, String userId);

    /**
     * 复制媒体文件
     * 
     * @param sourceMediaId 源媒体文件ID
     * @param targetMessageId 目标消息ID
     * @param userId 用户ID
     * @return 新媒体文件ID
     */
    String copyMedia(String sourceMediaId, String targetMessageId, String userId);

    /**
     * 移动媒体文件
     * 
     * @param mediaId 媒体文件ID
     * @param targetMessageId 目标消息ID
     * @param userId 用户ID
     * @return 移动结果
     */
    Boolean moveMedia(String mediaId, String targetMessageId, String userId);

    /**
     * 设置媒体文件访问权限
     * 
     * @param mediaId 媒体文件ID
     * @param accessLevel 访问级别
     * @param userId 用户ID
     * @return 设置结果
     */
    Boolean setMediaAccess(String mediaId, String accessLevel, String userId);

    /**
     * 获取媒体文件元数据
     * 
     * @param mediaId 媒体文件ID
     * @param userId 用户ID
     * @return 元数据信息
     */
    Object getMediaMetadata(String mediaId, String userId);
}
